package com.zut.AOP;

import com.zut.Annotations.MyLogs;
import lombok.extern.log4j.Log4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
@Aspect
@Log4j
public class LogsAop {
    @Pointcut(value = "@annotation(com.zut.Annotations.MyLogs)") //其中value可以写多种表达式定义切入点，后续详解
    public void cutMethod() {
    }
    @Before("cutMethod()")
    public void begin() {

    }

    /**
     * 后置通知：在目标方法执行后调用，若目标方法出现异常，则不执行
     */
    @AfterReturning("cutMethod()")
    public void afterReturning() {
    }

    /**
     * 后置/最终通知：无论目标方法在执行过程中出现一场都会在它之后调用
     */
    @After("cutMethod()")
    public void after() {

    }

    /**
     * 异常通知：目标方法抛出异常时执行
     */
    @AfterThrowing("cutMethod()")
    public void afterThrowing() {


    }

    /**
     * 环绕通知：灵活自由的在目标方法中切入代码
     */
    @Around("cutMethod() && @annotation(myLogs)")
    public Object around(ProceedingJoinPoint joinPoint, MyLogs myLogs) throws Throwable {
        Object[] args = joinPoint.getArgs();
        log.error(Arrays.asList(args).toString());
        Object proceed = joinPoint.proceed();
        log.error(proceed);
        return proceed;
    }


}